﻿using System;
using System.Data;
using MySql.Data.MySqlClient;
using SiGeCoPre.Presupuesto_Conexion;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_DAOIMPL
{
    /// <summary>
    /// Clase que implementa DAOMantenimiento
    /// </summary>
    class DAOIMPLMantenimiento:Presupuesto_DAO.DAOMantenimiento
    {
        /// <summary>
        /// Guarda una tarea de mantenimiento
        /// </summary>
        /// <param name="nombre_tarea">Nombre de la tarea</param>
        /// <param name="descripcion">Descripción de la tarea</param>
        /// <param name="activo">Determina si está activo en la base de datos</param>
        /// <returns>Devuelve true si fue insertada correctamente o false si falló</returns>
        public bool saveMantenimiento(string nombre_tarea, string descripcion, bool activo)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand insertar = conexion.CreateCommand();
                insertar.CommandText = "INSERT INTO mantenimiento(nombre_tarea, descripcion, activo)"
                                        + " VALUES(@nombre_tarea, @descripcion, @activo)";
                insertar.Parameters.AddWithValue("@nombre_tarea", nombre_tarea);
                insertar.Parameters.AddWithValue("@descripcion", descripcion);
                insertar.Parameters.AddWithValue("@activo", activo);
                insertar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica una tarea de mantenimiento
        /// </summary>
        /// <param name="nombre_tarea">Nombre de la tarea</param>
        /// <param name="descripcion">Descripción de la tarea</param>
        /// <param name="activo">Determina si está activa en la base de datos</param>
        /// <param name="id">Determina la tarea a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateMantenimiento(string nombre_tarea, string descripcion, bool activo, int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand modificar = conexion.CreateCommand();
                modificar.CommandText = "UPDATE mantenimiento SET nombre_tarea = @nombre_tarea, descripcion = @descripcion, activo = @activo"
                                        + " WHERE id = @id";
                modificar.Parameters.AddWithValue("@nombre_tarea", nombre_tarea);
                modificar.Parameters.AddWithValue("@descripcion", descripcion);
                modificar.Parameters.AddWithValue("@activo", activo);
                modificar.Parameters.AddWithValue("@id", id);
                modificar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un tarea de mantenimiento
        /// </summary>
        /// <param name="id">Determina la tarea a eliminar</param>
        /// <returns>Devuelve true si fue eliminada correctamente o false si falló</returns>
        public bool deleteMantenimiento(int id)
        {
            Boolean correcto = false;
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand eliminar = conexion.CreateCommand();
                eliminar.CommandText = "UPDATE mantenimiento SET activo = @activo"
                                        + " WHERE id = @id";
                eliminar.Parameters.AddWithValue("@activo", 0);
                eliminar.Parameters.AddWithValue("@id", id);
                eliminar.ExecuteNonQuery();
                correcto = true;
                conexion.Close();
                conexion.Dispose();
            }
            catch (Exception ex)
            {
                correcto = false;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista las tareas de mantenimiento
        /// </summary>
        /// <returns>Devuelve una tabla con todas las tareas</returns>
        public DataTable getAllMantenimiento()
        {
            DataTable tareas = new DataTable();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand listado = conexion.CreateCommand();
                listado.CommandText = "SELECT * FROM mantenimiento";
                MySqlDataAdapter adaptador = new MySqlDataAdapter(listado);
                adaptador.Fill(tareas);
                adaptador.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                tareas = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return tareas;
        }

        /// <summary>
        /// Obtiene una tarea de mantenimiento
        /// </summary>
        /// <param name="nombre_tarea">Determina la tarea a obtener</param>
        /// <returns>Devuelve un objeto mantenimiento</returns>
        public mantenimiento getMantenimiento(string nombre_tarea)
        {
            mantenimiento m = new mantenimiento();
            MySqlConnection conexion = Conexion.conexionMySQL();
            try
            {

                conexion.Open();
                MySqlCommand consulta = conexion.CreateCommand();
                consulta.CommandText = "SELECT * FROM mantenimiento WHERE nombre_tarea = @nombre";
                consulta.Parameters.AddWithValue("@nombre", nombre_tarea);
                MySqlDataReader lector = consulta.ExecuteReader();
                while (lector.Read())
                {
                    m.Activo = Convert.ToBoolean(lector["activo"].ToString());
                    m.Descripcion = lector["descripcion"].ToString();
                    m.NombreTarea = lector["nombre_tarea"].ToString();
                    m.ID = Convert.ToInt16(lector["id"].ToString());
                }

                lector.Close();
                lector.Dispose();
                conexion.Close();
                conexion.Dispose();

            }
            catch (Exception ex)
            {
                m = null;
                conexion.Close();
                conexion.Dispose();
                Texto.escribirLog(ex.Message);
                throw new DAOException(ex.Message);
            }

            return m;
        }
    }
}
